package filter;

import beans.User;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import service.UserService;
import utils.CookieUtils;

import java.io.IOException;
/**
 * 过滤器拦截所有请求=>过滤器处理之后=>放行
 * 自动登录过滤器核心目的: 恢复用户登录状态
 *   判断用户登录状态(判断Session中是否有用户)
 *   1.有=>用户依然是登录状态=>没必要利用过滤器还原会话状态=>直接放行
 *   2.没有
 *     a.查找name为autoLogin的cookie
 *       1.如果没找到name为autoLogin的cookie=>说明用户登陆时候没有勾选记住我=>放行
 *       2.如果找到name为autoLogin的cookie
 *         从cookie中取出用户名和密码,根据用户名和密码查询数据库
 *         1.查到=>将用户信息存入session=>用户会话状态恢复=>放行
 *         2.没查到=>cookie中用户信息有可能被篡改=>不恢复会话状态=>放行
 */
@WebFilter("/*")
public class AutoLoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //0.将request,response向下转型,为了使用HttpServletRequest HttpServletResponse里面的API
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        //1.判断用户登录状态(判断Session中是否有用户)
        User existUser = (User) req.getSession().getAttribute("existUser");
        if (existUser != null) {
            //有=>用户依然是登录状态=>没必要利用过滤器还原会话状态=>直接放行
            chain.doFilter(req, resp);
        } else {
            //没有会话状态
            Cookie cookie = CookieUtils.getCookie("autoLogin", req.getCookies());
            if (cookie == null) {
                //如果没找到name为autoLogin的cookie=>说明用户登陆时候没有勾选记住我=>放行
                chain.doFilter(req, resp);
            } else {
                String[] values = cookie.getValue().split("#");//values中存储用户名和密码
                //从cookie中取出用户名和密码,根据用户名和密码查询数据库
                UserService userService = new UserService();
                User user = userService.login(new User(values[0], values[1]));
                if (user == null) {
                    //说明没查到=>cookie中用户信息有可能被篡改=>不恢复会话状态=>放行
                    chain.doFilter(req, resp);
                } else {
                    //查到=>将用户信息存入session=>用户会话状态恢复=>放行
                    req.getSession().setAttribute("existUser", user);
                    chain.doFilter(req, resp);
                }
            }
        }
    }
}
